package com.tiancheng.trade.order.service;

import com.tiancheng.trade.commom.core.data.PageInfo;
import com.tiancheng.trade.commom.core.exception.BusinessException;
import com.tiancheng.trade.order.bo.SubOrderBO;
import com.tiancheng.trade.order.bo.SubOrderRefundBO;
import com.tiancheng.trade.order.model.IntSubOrder;
import com.tiancheng.trade.order.model.join.IntSubOrderJoin;
import com.tiancheng.trade.order.vo.admin.QuerySubOrderVO;
import com.tiancheng.trade.order.vo.admin.res.SubOrderDetailResVO;
import com.tiancheng.trade.order.vo.admin.res.SubOrderResVO;
import com.tiancheng.trade.order.vo.api.ReportOrderStatusVO;

import java.util.List;

/**
 * @Description: 子订单Service接口
 */
public interface IntSubOrderService {

    PageInfo<SubOrderResVO> querySubOrderList(QuerySubOrderVO subOrderVO);

    /**
     * 创建子订单
     *
     * @param subOrderBOS
     * @return
     * @throws BusinessException
     */
    int create(List<SubOrderBO> subOrderBOS) throws BusinessException;

    /**
     * 子订单已支付
     *
     * @param orderId
     * @param couponAmount 优惠金额
     * @return
     * @throws BusinessException
     */
    int paid(String orderId, Integer couponAmount) throws BusinessException;


    /**
     * 查询主订单下的子订单列表
     *
     * @param orderId
     * @return
     */
    List<IntSubOrder> find(String orderId);

    /**
     * 子订单发起退款
     *
     * @param subOrderIds
     * @return
     */
    int refundIng(String[] subOrderIds);

    /**
     * 查询可以退款的子订单
     *
     * @param orderId
     * @param subOrderIds
     * @return
     */
    List<IntSubOrder> findCanRefund(String orderId, String[] subOrderIds);

    /**
     * 根据子订单id查询单笔子订单数据
     *
     * @param subId
     * @return
     */
    IntSubOrder findBySubId(String subId);



    /**
     * 子订单退款结果
     *
     * @param subOrderRefundBOS
     * @return
     */
    int refund(List<SubOrderRefundBO> subOrderRefundBOS);

    /**
     * 根据主订单id查询子订单信息
     *
     * @param orderId
     * @return
     */
    List<IntSubOrder> findByOrderId(String orderId);

    SubOrderDetailResVO findSubOrderBySubId(String subId);

    /**
     * 子订单业务侧状态流转处理
     *
     * @param orderId
     * @param subOrderId
     * @param bizStatus
     * @throws BusinessException
     */
    void statusFlow(String orderId, String[] subOrderId, String bizStatus) throws BusinessException;

    /**
     * 获取指定子订单，并关联主订单、优惠券
     *
     * @param subOrderId
     * @return
     */
    IntSubOrderJoin getWithJoin(String subOrderId);

    /**
     * 查询主订单下指定的子订单
     *
     * @param orderId
     * @param subOrderIds
     * @return
     */
    List<IntSubOrder> find(String orderId, String[] subOrderIds);


    /**
     * 订单状态上报
     * @param date
     */
    void reportOrderStatus(ReportOrderStatusVO date);
}
